🎖️GitЯра🎖️
Commit e8af75e09b4f8d6a533c2807216316fb3469da6b
Parents : 80feda2
Author : James Rich <2199651+jamesarich@users.noreply.github.com>
Signature : Signature validation error
Date : 2026-08-15T19:40:10Z
Committer : GitHub <noreply@github.com>
Date : 2026-08-15T19:40:10Z
feat(icons): add Material icons for custom SF Symbols and fix soil telemetry icons (#6722)
Changes
9 files changed, 54 insertions(+), 10 deletions(-)
Diff
diff --git a/core/resources/drawable-svg/ic_foxhunt.svg b/core/resources/drawable-svg/ic_foxhunt.svg
new file mode 100644
index 0000000000..4ffee13394
--- /dev/null
+++ b/core/resources/drawable-svg/ic_foxhunt.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path fill="currentColor" d="M6.2,4.1C7.8,2.8 9.8,2 12,2C14.2,2 16.2,2.8 17.8,4.1L16.8,5.2C15.4,4.1 13.8,3.5 12,3.5C10.2,3.5 8.6,4.1 7.2,5.2ZM7.8,6.8C9,5.7 10.4,5 12,5C13.6,5 15,5.7 16.2,6.8L15.2,7.9C14.3,7 13.2,6.5 12,6.5C10.8,6.5 9.7,7 8.8,7.9Z"/>
+ <path fill="currentColor" fill-rule="evenodd" d="M12,12.5L10,11.5L5.5,8.5L3.5,15L12,22L20.5,15L18.5,8.5L14,11.5ZM6.5,12.5L8.5,11.8L6.2,9.8ZM17.5,12.5L17.8,9.8L15.5,11.8ZM8.2,14.8L8.5,15.8L10.5,15.5ZM15.8,14.8L13.5,15.5L15.5,15.8ZM11.2,20.2L12,21.4L12.8,20.2Z"/>
+</svg>
diff --git a/core/resources/drawable-svg/ic_mesh_radio.svg b/core/resources/drawable-svg/ic_mesh_radio.svg
new file mode 100644
index 0000000000..84631a1edd
--- /dev/null
+++ b/core/resources/drawable-svg/ic_mesh_radio.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path fill="currentColor" fill-rule="evenodd" d="M8,2C7.45,2 7,2.45 7,3L7,9C5.9,9 5,9.9 5,11L5,20C5,21.1 5.9,22 7,22L17,22C18.1,22 19,21.1 19,20L19,11C19,9.9 18.1,9 17,9L17,7C17,6.45 16.55,6 16,6C15.45,6 15,6.45 15,7L15,9L9,9L9,3C9,2.45 8.55,2 8,2ZM8.5,11L15.5,11C16.05,11 16.5,11.45 16.5,12L16.5,14.5C16.5,15.05 16.05,15.5 15.5,15.5L8.5,15.5C7.95,15.5 7.5,15.05 7.5,14.5L7.5,12C7.5,11.45 7.95,11 8.5,11ZM9,17L15,17C15.55,17 16,17.22 16,17.5C16,17.78 15.55,18 15,18L9,18C8.45,18 8,17.78 8,17.5C8,17.22 8.45,17 9,17ZM9,19.2L15,19.2C15.55,19.2 16,19.42 16,19.7C16,19.98 15.55,20.2 15,20.2L9,20.2C8.45,20.2 8,19.98 8,19.7C8,19.42 8.45,19.2 9,19.2Z"/>
+ <path fill="currentColor" d="M5.8,3.3C5.1,4 4.7,4.7 4.7,5.5C4.7,6.3 5.1,7 5.8,7.7L6.7,6.8C6.2,6.3 5.9,5.9 5.9,5.5C5.9,5.1 6.2,4.7 6.7,4.2ZM3.8,2.1C2.8,3.2 2.2,4.3 2.2,5.5C2.2,6.7 2.8,7.8 3.8,8.9L4.7,8C3.9,7.2 3.4,6.4 3.4,5.5C3.4,4.6 3.9,3.8 4.7,3Z"/>
+</svg>
diff --git a/core/resources/src/commonMain/composeResources/drawable/ic_foxhunt.xml b/core/resources/src/commonMain/composeResources/drawable/ic_foxhunt.xml
new file mode 100644
index 0000000000..f6901ee712
--- /dev/null
+++ b/core/resources/src/commonMain/composeResources/drawable/ic_foxhunt.xml
@@ -0,0 +1,13 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.2,4.1C7.8,2.8 9.8,2 12,2C14.2,2 16.2,2.8 17.8,4.1L16.8,5.2C15.4,4.1 13.8,3.5 12,3.5C10.2,3.5 8.6,4.1 7.2,5.2ZM7.8,6.8C9,5.7 10.4,5 12,5C13.6,5 15,5.7 16.2,6.8L15.2,7.9C14.3,7 13.2,6.5 12,6.5C10.8,6.5 9.7,7 8.8,7.9Z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:fillType="evenOdd"
+ android:pathData="M12,12.5L10,11.5L5.5,8.5L3.5,15L12,22L20.5,15L18.5,8.5L14,11.5ZM6.5,12.5L8.5,11.8L6.2,9.8ZM17.5,12.5L17.8,9.8L15.5,11.8ZM8.2,14.8L8.5,15.8L10.5,15.5ZM15.8,14.8L13.5,15.5L15.5,15.8ZM11.2,20.2L12,21.4L12.8,20.2Z"/>
+</vector>
diff --git a/core/resources/src/commonMain/composeResources/drawable/ic_mesh_radio.xml b/core/resources/src/commonMain/composeResources/drawable/ic_mesh_radio.xml
new file mode 100644
index 0000000000..9c41c5a7a6
--- /dev/null
+++ b/core/resources/src/commonMain/composeResources/drawable/ic_mesh_radio.xml
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8,2C7.45,2 7,2.45 7,3L7,9C5.9,9 5,9.9 5,11L5,20C5,21.1 5.9,22 7,22L17,22C18.1,22 19,21.1 19,20L19,11C19,9.9 18.1,9 17,9L17,7C17,6.45 16.55,6 16,6C15.45,6 15,6.45 15,7L15,9L9,9L9,3C9,2.45 8.55,2 8,2ZM8.5,11L15.5,11C16.05,11 16.5,11.45 16.5,12L16.5,14.5C16.5,15.05 16.05,15.5 15.5,15.5L8.5,15.5C7.95,15.5 7.5,15.05 7.5,14.5L7.5,12C7.5,11.45 7.95,11 8.5,11ZM9,17L15,17C15.55,17 16,17.22 16,17.5C16,17.78 15.55,18 15,18L9,18C8.45,18 8,17.78 8,17.5C8,17.22 8.45,17 9,17ZM9,19.2L15,19.2C15.55,19.2 16,19.42 16,19.7C16,19.98 15.55,20.2 15,20.2L9,20.2C8.45,20.2 8,19.98 8,19.7C8,19.42 8.45,19.2 9,19.2Z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M5.8,3.3C5.1,4 4.7,4.7 4.7,5.5C4.7,6.3 5.1,7 5.8,7.7L6.7,6.8C6.2,6.3 5.9,5.9 5.9,5.5C5.9,5.1 6.2,4.7 6.7,4.2ZM3.8,2.1C2.8,3.2 2.2,4.3 2.2,5.5C2.2,6.7 2.8,7.8 3.8,8.9L4.7,8C3.9,7.2 3.4,6.4 3.4,5.5C3.4,4.6 3.9,3.8 4.7,3Z"/>
+</vector>
diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Device.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Device.kt
index c2b03e0baa..4c8b6236e4 100644
--- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Device.kt
+++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Device.kt
@@ -23,6 +23,7 @@ import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.ic_android
import org.meshtastic.core.resources.ic_fingerprint
import org.meshtastic.core.resources.ic_fork_left
+import org.meshtastic.core.resources.ic_foxhunt
import org.meshtastic.core.resources.ic_home
import org.meshtastic.core.resources.ic_icecream
import org.meshtastic.core.resources.ic_memory
@@ -77,3 +78,5 @@ val MeshtasticIcons.Android: ImageVector
@Composable get() = vectorResource(Res.drawable.ic_android)
val MeshtasticIcons.HardwareModel: ImageVector
@Composable get() = vectorResource(Res.drawable.ic_memory)
+val MeshtasticIcons.Foxhunt: ImageVector
+ @Composable get() = vectorResource(Res.drawable.ic_foxhunt)
diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Hardware.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Hardware.kt
index 9c491a2dc8..1f04a6687e 100644
--- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Hardware.kt
+++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Hardware.kt
@@ -26,6 +26,7 @@ import org.meshtastic.core.resources.ic_bluetooth_searching
import org.meshtastic.core.resources.ic_cached
import org.meshtastic.core.resources.ic_display_settings
import org.meshtastic.core.resources.ic_memory
+import org.meshtastic.core.resources.ic_mesh_radio
import org.meshtastic.core.resources.ic_nfc
import org.meshtastic.core.resources.ic_settings_input_antenna
import org.meshtastic.core.resources.ic_speaker_phone
@@ -60,3 +61,5 @@ val MeshtasticIcons.Memory: ImageVector
@Composable get() = vectorResource(Res.drawable.ic_memory)
val MeshtasticIcons.DisplaySettings: ImageVector
@Composable get() = vectorResource(Res.drawable.ic_display_settings)
+val MeshtasticIcons.MeshRadio: ImageVector
+ @Composable get() = vectorResource(Res.drawable.ic_mesh_radio)
diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Status.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Status.kt
index 00e04cfc2b..7538233137 100644
--- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Status.kt
+++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Status.kt
@@ -121,6 +121,8 @@ val MeshtasticIcons.DeviceSleep: ImageVector
// Node connection state (non-MQTT)
val MeshtasticIcons.Disconnected: ImageVector
@Composable get() = vectorResource(Res.drawable.ic_link_off)
+val MeshtasticIcons.LinkOff: ImageVector
+ @Composable get() = vectorResource(Res.drawable.ic_link_off)
// Message delivery status
val MeshtasticIcons.MessageEnroute: ImageVector
diff --git a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Telemetry.kt b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Telemetry.kt
index 58ba12396b..41eb1bade5 100644
--- a/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Telemetry.kt
+++ b/core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/icon/Telemetry.kt
@@ -28,7 +28,6 @@ import org.meshtastic.core.resources.ic_compress
import org.meshtastic.core.resources.ic_data_array
import org.meshtastic.core.resources.ic_electric_bolt
import org.meshtastic.core.resources.ic_explore
-import org.meshtastic.core.resources.ic_grass
import org.meshtastic.core.resources.ic_height
import org.meshtastic.core.resources.ic_light_mode
import org.meshtastic.core.resources.ic_line_axis
@@ -37,6 +36,8 @@ import org.meshtastic.core.resources.ic_power
import org.meshtastic.core.resources.ic_satellite_alt
import org.meshtastic.core.resources.ic_scale
import org.meshtastic.core.resources.ic_social_distance
+import org.meshtastic.core.resources.ic_soil_moisture
+import org.meshtastic.core.resources.ic_soil_temperature
import org.meshtastic.core.resources.ic_speed
import org.meshtastic.core.resources.ic_stacked_line_chart
import org.meshtastic.core.resources.ic_thermostat
@@ -48,7 +49,9 @@ val MeshtasticIcons.Humidity: ImageVector
val MeshtasticIcons.Pressure: ImageVector
@Composable get() = vectorResource(Res.drawable.ic_compress)
val MeshtasticIcons.SoilMoisture: ImageVector
- @Composable get() = vectorResource(Res.drawable.ic_grass)
+ @Composable get() = vectorResource(Res.drawable.ic_soil_moisture)
+val MeshtasticIcons.SoilTemperature: ImageVector
+ @Composable get() = vectorResource(Res.drawable.ic_soil_temperature)
val MeshtasticIcons.ElectricPower: ImageVector
@Composable get() = vectorResource(Res.drawable.ic_electric_bolt)
val MeshtasticIcons.Distance: ImageVector
diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/EnvironmentMetrics.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/EnvironmentMetrics.kt
index c921a8081c..16a53a6816 100644
--- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/EnvironmentMetrics.kt
+++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/EnvironmentMetrics.kt
@@ -38,8 +38,6 @@ import org.meshtastic.core.resources.iaq
import org.meshtastic.core.resources.ic_dew_point
import org.meshtastic.core.resources.ic_electric_bolt
import org.meshtastic.core.resources.ic_radioactive
-import org.meshtastic.core.resources.ic_soil_moisture
-import org.meshtastic.core.resources.ic_soil_temperature
import org.meshtastic.core.resources.lux
import org.meshtastic.core.resources.one_wire_temperature
import org.meshtastic.core.resources.pressure
@@ -59,6 +57,8 @@ import org.meshtastic.core.ui.icon.MeshtasticIcons
import org.meshtastic.core.ui.icon.Particulate
import org.meshtastic.core.ui.icon.PowerSupply
import org.meshtastic.core.ui.icon.Pressure
+import org.meshtastic.core.ui.icon.SoilMoisture
+import org.meshtastic.core.ui.icon.SoilTemperature
import org.meshtastic.core.ui.icon.Temperature
import org.meshtastic.core.ui.icon.Voltage
import org.meshtastic.core.ui.icon.Weight
@@ -220,17 +220,17 @@ internal fun EnvironmentMetrics(
soil_temperature
?.takeUnless { it.isNaN() }
?.let {
- DrawableMetricInfo(
+ VectorMetricInfo(
label = Res.string.soil_temperature,
value = it.toTempString(isFahrenheit),
- icon = Res.drawable.ic_soil_temperature,
+ icon = MeshtasticIcons.SoilTemperature,
)
},
soil_moisture?.let {
- DrawableMetricInfo(
+ VectorMetricInfo(
label = Res.string.soil_moisture,
value = "$it%",
- icon = Res.drawable.ic_soil_moisture,
+ icon = MeshtasticIcons.SoilMoisture,
)
},
),
@@ -252,10 +252,10 @@ internal fun EnvironmentMetrics(
?.takeIf { !it.isNaN() }
?.let { temp ->
add(
- DrawableMetricInfo(
+ VectorMetricInfo(
label = Res.string.one_wire_temperature,
value = temp.toTempString(isFahrenheit),
- icon = Res.drawable.ic_soil_temperature,
+ icon = MeshtasticIcons.SoilTemperature,
channelNumber = channel + 1,
)
.asGroup(),
Served by rngit 1.5.0 - Generated in 0.18s